package datosServer;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Daniela
 */
import java.util.*;
//import java.lang.Math;

public class ListaPieza {
    private List <Pieza> piezas;


    public ListaPieza() {
        piezas = new ArrayList();
    }

    public List<Pieza> getPiezas() {
        return piezas;
    }

    public void setPiezas(List<Pieza> piezas) {
        this.piezas = piezas;
    }

     public Iterator getIterator()
    {
        return piezas.iterator();
    }




    public boolean agregarElemento(Pieza objeto){
        return piezas.add(objeto);

    }

     public void imprimirColeccion()
     {
        int i;
        Pieza registro;

        /*
         * Se define un arreglo de tipo Object (la clase genérica Java)
         */
        Object [] arreglo;

        /*
         * Se convierte la colección pasada como parámetro a un array, que
         * es asignado al arreglo de tipo Object
         */
        arreglo = piezas.toArray();

        System.out.println("DATOS");

        /*
         * Se hace un recorrido del arreglo de tipo Object y se imprime
         * la información de la casilla i
         */
        for(i=0 ; i<arreglo.length ; i++)
        {
            registro = (Pieza) arreglo[i];
            System.out.println("ValorSuperior: " + registro.getValSuperior());
            System.out.println("ValorInferior: " + registro.getValInferior());
            System.out.println("ID: " + registro.getID());
            System.out.println();
        }

        System.out.println("\n\n");


    }

    /* Funcion que inicializa las piezas con un valor del 0 al 6   */
/*    public ListaPieza inicializarPiezas(){
        int i, j, cont;
        cont = 0;

        Pieza pieza;

                for (i = 0; i <= 6; i++){
                    if (i >= 1)
                        cont = i;
                    for (j = cont; j <= 6; j++){
                         pieza = new Pieza(i,j,false,false,false);
                         this.agregarElemento(pieza);
                    }
                }
        return this;
    }
*/

     public ListaPieza removerPiezas(ListaPieza piezas,Pieza piezaRemover)
    {
         boolean removido=false;

         for (Pieza piezaTotal : piezas.getPiezas())
         {
            if (piezaRemover.getValSuperior()==piezaTotal.getValSuperior() && piezaRemover.getValInferior()==piezaTotal.getValInferior())
            {
                removido=piezas.getPiezas().remove(piezaTotal);
                //System.out.println("removido... " + removido);
                return piezas;
            }
         }

         return null;
     }







    public boolean removerElemento(Pieza objeto)
    {
        boolean encontrado = false;
        Pieza auxiliar = null;

        /*
         * Se define un iterador inicializado con el iterador de la colección
         */
        Iterator iterador = piezas.iterator();
        //System.out.println("valor del iterador = \n\n" + iterador);

        /*
         * Mientras no se encuentre el elemento y existan mas elementos en la
         * colección, se sigue entrando en el ciclo
         */
        while (!encontrado && iterador.hasNext())
        {
            /*
             *  Se obtiene el siguiente objeto del iterador y se le hace un cast
             *  para asignarlo al objeto de tipo Nodo
             */
            auxiliar = (Pieza) iterador.next();
            //System.out.println("auxiliar = " + auxiliar);
            //System.out.println("objeto = " + objeto);
            /*
             * Se invoca al método equals de la clase Nodo para determinar si son
             * iguales. En caso de serlo, se encontró el elemento buscado
             */
            if (objeto.equals(auxiliar))
                encontrado = true;
        }

        /*
         * Si se encontró el elemento, se procede a ejecutar el remove
         */
        //System.out.println("lo encontro = " + encontrado);
        if (encontrado)
        {

            if (piezas.remove(auxiliar))
                return true;
        }

        return false;
    }


    public Pieza obtenerObjetoDeLaCasilla(int posicion){
           Pieza objeto, aux;
        //int i = 0;
        aux = objeto = null;
        //Iterator iterador = piezas.iterator();


        //System.out.println("\n\n\nposicion = " + posicion);
        //System.out.println("piezas------------    " + piezas);
        if (piezas.isEmpty() != true )
        {
            objeto = piezas.get(posicion);
            //System.out.println("(Lista Pieza)objetooooooooooo------------    " + objeto);
        }
        //System.out.println("objeto---------------> " + objeto);
        return objeto;

    }





    /*public ListaPieza generarPiezasAleatorias(){
        int cont, posicion;
        Pieza pieza = null;
        boolean valor = false;
        ListaPieza piezasJugador = new ListaPieza();
        posicion = 0;
        cont = 1;

        while (cont <= 7) {
             posicion = (int) (Math.random() * piezas.size());
             pieza = obtenerObjetoDeLaCasilla(posicion);
             //System.out.println("tamaño de piezas " + piezas.size());
             //System.out.println("pieza---> " + pieza);
             piezasJugador.agregarElemento(pieza);
             valor = this.removerElemento(pieza);
            /* if (valor == true)
                 System.out.println("Si se borro\n");
             else
                 System.out.println("No se borro\n");
             *
             */
       /*      cont++;
        }

        return piezasJugador;

    }*/


    public String devolverListaDePiezas()
    {
        String resultado = "";
        int i = 0;
        Pieza aux = null;

        while (i < piezas.size() )
        {
            aux = (Pieza) piezas.get(i);

            if (i != piezas.size() - 1)
                resultado += aux.getID() + "-" + aux.getValSuperior() + "-" + aux.getValInferior() + "-" + aux.getImagenA() + "-" + aux.getImagenB() + "-" + aux.getImagenI() + "-" + aux.getImagenD() + ":";
            else
                resultado += aux.getID() + "-" + aux.getValSuperior() + "-" + aux.getValInferior() + "-" + aux.getImagenA() + "-" + aux.getImagenB() + "-" + aux.getImagenI() + "-" + aux.getImagenD();

            i++;
        }

        return resultado;
    }
   public boolean removerElementoImagenAsociada(ListaPieza piezasJugador,String ImagenAsociada)
    {
        boolean encontrado = false;
        System.out.println("\n(Lista Pieza)ImagenSeleccionada en remover elimento por Imagen Asociada\n"+ImagenAsociada);
       // System.out.println("Piezas del jugador en remover\n");
      //  piezasJugador.imprimirColeccion();
         // Se define un iterador inicializado con el iterador de la colección

        for (Pieza pieza : piezasJugador.getPiezas())
        {
            /*System.out.println("Imagen Asociada: "+ImagenAsociada);
            System.out.println("A. "+pieza.getImagenA());
            System.out.println("B. "+pieza.getImagenB());
            System.out.println("I. "+pieza.getImagenI());
             System.out.println("D. "+pieza.getImagenD());*/
           if (pieza.getImagenA().compareTo(ImagenAsociada) != 0 )
           {

               if (pieza.getImagenB().compareTo(ImagenAsociada) != 0 )
               {

                   if (pieza.getImagenI().compareTo(ImagenAsociada) != 0 )
                   {

                       if (pieza.getImagenD().compareTo(ImagenAsociada) != 0)
                       {

                           encontrado=false;
                       }
                       else
                       {
                           return piezasJugador.getPiezas().remove(pieza);
                       }

                   encontrado=false;
                   }
                   else
                   {
                       return piezasJugador.getPiezas().remove(pieza);
                   }
               encontrado=false;
               }
               else
               {
                   return piezasJugador.getPiezas().remove(pieza);
               }
           encontrado=false;
           }
           else
           {
               return piezasJugador.getPiezas().remove(pieza);
           }
        }
        return encontrado;
    }

    public Pieza BuscarPiezaImagenAsociada(ListaPieza piezasJugador,String ImagenAsociada)
    {
        Pieza encontrado = null;
      /*  System.out.println("Piezas del jugador en Buscar pieza por imagen asociada\n");
        piezasJugador.imprimirColeccion();*/
         // Se define un iterador inicializado con el iterador de la colección
        System.out.println("\n(Lista Pieza)Imagen Asociada en buscar pieza Asociada: "+ImagenAsociada);
        for (Pieza pieza : piezasJugador.getPiezas())
        {
           /* System.out.println("Imagen Asociada: "+ImagenAsociada);
            System.out.println("A. "+pieza.getImagenA());
            System.out.println("B. "+pieza.getImagenB());
            System.out.println("I. "+pieza.getImagenI());
             System.out.println("D. "+pieza.getImagenD());*/
           if (pieza.getImagenA().compareTo(ImagenAsociada) != 0 )
           {

               if (pieza.getImagenB().compareTo(ImagenAsociada) != 0 )
               {

                   if (pieza.getImagenI().compareTo(ImagenAsociada) != 0 )
                   {

                       if (pieza.getImagenD().compareTo(ImagenAsociada) != 0)
                       {

                           encontrado=null;
                       }
                       else
                       {
                           return pieza;
                       }

                   encontrado=null;
                   }
                   else
                   {
                       return pieza;
                   }
               encontrado=null;
               }
               else
               {
                   return pieza;
               }
           encontrado=null;
           }
           else
           {
               return pieza;
           }
        }
        return encontrado;
    }




  /*   public String PosicionFichaDelOponente(Usuario user, Pieza piezaJugada, Pieza Oponente)
      {
          int coorPJugadaX, coorPJugadaY; coorPJugadaX= coorPJugadaY=0;
          int tamañoTabX, tamañoTabY;
          tamañoTabX = user.getPartida().tamañoTableroX;
          tamañoTabY = user.getPartida().tamañoTableroY;

          Pieza tab[][] = user.getPartida().getTablero();

          coorPJugadaX = piezaJugada.getCoordenadaX();
          coorPJugadaY = piezaJugada.getCoordenadaY();


          if( coorPJugadaX == 0 && coorPJugadaY==0 )
          {
             Oponente.setCoordenadaX(coorPJugadaX);
             Oponente.setCoordenadaY(coorPJugadaY+1);





          }

    */

    public Pieza BuscarPiezaOponente(ListaPieza piezasMaquina,int cabeza, int cola)
    {
    //    int valorS=0; int valorI=0;

       // valorS=PJugador.getValSuperior(); valorI=PJugador.getValInferior();
        System.out.println("\n(BuscarPOpo)Cabeza = "+cabeza+"   Cola= "+cola+"\n");

        //piezasMaquina.imprimirColeccion();

        for (Pieza pieza : piezasMaquina.getPiezas())
        {
            //System.out.println("Valor pieza Maquina(Sup)= "+pieza.getValSuperior()+" Valor pieza Maquina(Inf)= "+pieza.getValInferior()+"\n");

            if (pieza.getValSuperior()==cabeza || pieza.getValSuperior()==cola)
                return pieza;
            else
            {
                if (pieza.getValInferior()==cabeza || pieza.getValInferior()==cola)
                  return pieza;
            }
        }
        return null;
    }

    @Override
    public boolean equals(Object obj) 
    {
        Pieza piezaAux = new Pieza();

        piezaAux = (Pieza) obj;
        for (Pieza pieza : piezas)
        {
            if (pieza.getValInferior()==piezaAux.getValInferior() && pieza.getValSuperior()==piezaAux.getValSuperior())
            {
                return true;
            }
        }
        return false;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        return hash;
    }




}